typora-copy-images-to: img

相关阅读

  1. Java基础:String类
  2. Java字符串格式化
  3. Java基础:正则表达式

1. 概述

字符串是由多个字符组成的一串数据(字符序列),字符串可以看成是字符数组。

在实际开发中,字符串的操作是最常见的操作,没有之一。而Java没有内置的字符串类型,所以,就在Java类库中提供了一个类String 供我们来使用。String 类代表字符串。

在应用程序中经常会用到字符串,所谓字符串就是指一连串的字符,它是由许多单个字符连接而成的,如多个英文字母所组成的一个英文单词。字符串中可以包含任意字符,这些字符必须包含在一对双引号“”之内,例如“abc”。在Java中定义了String和StringBuffer两个类来封装字符串,并提供了一系列操作字符串的方法,它们都位于java.lang包中,因此不需要导包就可以直接使用。

2. String类的特点

  • 字符串是常量,它的值在创建之后不能更改
  • Java 程序中的所有字符串字面值(如 “abc” )都作为此类的实例实现。
  • 字符串如果是变量相加,先开空间,在拼接。
  • 字符串如果是常量相加,是先加,然后在常量池找,如果有就直接返回,否则,就创建。
    1. package cn.itcast_02;
    2. /*
    3. * 字符串的特点:一旦被赋值,就不能改变。
    4. */
    5. public class StringDemo {
    6. public static void main(String[] args) {
    7. String s = "hello";
    8. s += "world";
    9. System.out.println("s:" + s); // helloworld
    10. }
    11. }

字符串在内存中1

字符串在内存中

字符串在内存中2

String s1 = new String(“hello”);String s2 = “hello”;有什么区别?

前者创建了2个或1个对象,后者创建了1个或0个对象。

  1. String s1 = new String(“hello”);
  2. String s2 = hello”;
  3. s1 == s2; // false
  4. s1.equals(s2); // true
  5. String s3 = hello”; String s4 = world”; String s5 = helloworld”;
  6. S5== s3 + s4 ; //fale
  7. s5 == hello + world”; //true

字符串如果是变量相加,先开空间,再拼接。

字符串如果是常量相加,是先加,然后到字符串常量池中找,如果有就直接返回,否则就创建。

1491268860124

3. 常见操作方法

1500705653143

3.1 构造方法

方法 说明
String() 创建一个内容为空的字符串
String(byte[]) 根据指定的字节数组创建对象
String(byte[],int,int) 根据字节数组的一部分创建对象
String(char[]) 根据指定的字符数组创建对象
String(char[],int,int) 根据字符数组的一部分创建对象
String(String) 根据指定的字符串内容创建对象
String(byte[] bytes, Charset charset) 使用指定的编码构造字符串对象
  1. package cn.itcast_01;
  2. /*
  3. * 字符串:就是由多个字符组成的一串数据。也可以看成是一个字符数组。
  4. * 通过查看API,我们可以知道
  5. * A:字符串字面值"abc"也可以看成是一个字符串对象。
  6. * B:字符串是常量,一旦被赋值,就不能被改变。
  7. *
  8. * 构造方法:
  9. * public String():空构造
  10. * public String(byte[] bytes):把字节数组转成字符串
  11. * public String(byte[] bytes,int index,int length):把字节数组的一部分转成字符串
  12. * public String(char[] value):把字符数组转成字符串
  13. * public String(char[] value,int index,int count):把字符数组的一部分转成字符串
  14. * public String(String original):把字符串常量值转成字符串
  15. *
  16. * 字符串的方法:
  17. * public int length():返回此字符串的长度。
  18. */
  19. public class StringDemo {
  20. public static void main(String[] args) {
  21. // public String():空构造
  22. String s1 = new String();
  23. System.out.println("s1:" + s1);
  24. System.out.println("s1.length():" + s1.length());
  25. System.out.println("--------------------------");
  26. // public String(byte[] bytes):把字节数组转成字符串
  27. byte[] bys = { 97, 98, 99, 100, 101 };
  28. String s2 = new String(bys);
  29. System.out.println("s2:" + s2);
  30. System.out.println("s2.length():" + s2.length());
  31. System.out.println("--------------------------");
  32. // public String(byte[] bytes,int index,int length):把字节数组的一部分转成字符串
  33. // 我想得到字符串"bcd"
  34. String s3 = new String(bys, 1, 3);
  35. System.out.println("s3:" + s3);
  36. System.out.println("s3.length():" + s3.length());
  37. System.out.println("--------------------------");
  38. // public String(char[] value):把字符数组转成字符串
  39. char[] chs = { 'a', 'b', 'c', 'd', 'e', '爱', '林', '亲' };
  40. String s4 = new String(chs);
  41. System.out.println("s4:" + s4);
  42. System.out.println("s4.length():" + s4.length());
  43. System.out.println("--------------------------");
  44. // public String(char[] value,int index,int count):把字符数组的一部分转成字符串
  45. String s5 = new String(chs, 2, 4);
  46. System.out.println("s5:" + s5);
  47. System.out.println("s5.length():" + s5.length());
  48. System.out.println("--------------------------");
  49. //public String(String original):把字符串常量值转成字符串
  50. String s6 = new String("abcde");
  51. System.out.println("s6:" + s6);
  52. System.out.println("s6.length():" + s6.length());
  53. System.out.println("--------------------------");
  54. //字符串字面值"abc"也可以看成是一个字符串对象。
  55. String s7 = "abcde";
  56. System.out.println("s7:"+s7);
  57. System.out.println("s7.length():"+s7.length());
  58. }
  59. }

运行结果:

  1. s1:
  2. s1.length():0
  3. --------------------------
  4. s2:abcde
  5. s2.length():5
  6. --------------------------
  7. s3:bcd
  8. s3.length():3
  9. --------------------------
  10. s4:abcde爱林亲
  11. s4.length():8
  12. --------------------------
  13. s5:cde
  14. s5.length():4
  15. --------------------------
  16. s6:abcde
  17. s6.length():5
  18. --------------------------
  19. s7:abcde
  20. s7.length():5

3.2 判断功能

方法 说明
equals() 比较字符串的内容是否相等,区分大小写
equalsIgnoreCase() 比较字符串的内容是否相等,忽略大小写
contains(String str) 判断大字符串中是否包含小字符串
startsWith() 判断字符串是否以某个字符串开头
endsWith() 判断字符串是否以某个字符串结尾
isEmpty() 判断字符串是否为空
  1. package cn.itcast_03;
  2. /*
  3. * String类的判断功能:
  4. * boolean equals(Object obj):比较字符串的内容是否相同,区分大小写
  5. * boolean equalsIgnoreCase(String str):比较字符串的内容是否相同,忽略大小写
  6. * boolean contains(String str):判断大字符串中是否包含小字符串
  7. * boolean startsWith(String str):判断字符串是否以某个指定的字符串开头
  8. * boolean endsWith(String str):判断字符串是否以某个指定的字符串结尾
  9. * boolean isEmpty():判断字符串是否为空。
  10. *
  11. * 注意:
  12. * 字符串内容为空和字符串对象为空。
  13. * String s = "";
  14. * String s = null;
  15. */
  16. public class StringDemo {
  17. public static void main(String[] args) {
  18. // 创建字符串对象
  19. String s1 = "helloworld";
  20. String s2 = "helloworld";
  21. String s3 = "HelloWorld";
  22. // boolean equals(Object obj):比较字符串的内容是否相同,区分大小写
  23. System.out.println("equals:" + s1.equals(s2));
  24. System.out.println("equals:" + s1.equals(s3));
  25. System.out.println("-----------------------");
  26. // boolean equalsIgnoreCase(String str):比较字符串的内容是否相同,忽略大小写
  27. System.out.println("equals:" + s1.equalsIgnoreCase(s2));
  28. System.out.println("equals:" + s1.equalsIgnoreCase(s3));
  29. System.out.println("-----------------------");
  30. // boolean contains(String str):判断大字符串中是否包含小字符串
  31. System.out.println("contains:" + s1.contains("hello"));
  32. System.out.println("contains:" + s1.contains("hw"));
  33. System.out.println("-----------------------");
  34. // boolean startsWith(String str):判断字符串是否以某个指定的字符串开头
  35. System.out.println("startsWith:" + s1.startsWith("h"));
  36. System.out.println("startsWith:" + s1.startsWith("hello"));
  37. System.out.println("startsWith:" + s1.startsWith("world"));
  38. System.out.println("-----------------------");
  39. // 练习:boolean endsWith(String str):判断字符串是否以某个指定的字符串结尾这个自己玩
  40. // boolean isEmpty():判断字符串是否为空。
  41. System.out.println("isEmpty:" + s1.isEmpty());
  42. String s4 = "";
  43. String s5 = null;
  44. System.out.println("isEmpty:" + s4.isEmpty());
  45. // NullPointerException
  46. // s5对象都不存在,所以不能调用方法,空指针异常
  47. System.out.println("isEmpty:" + s5.isEmpty());
  48. }
  49. }

运行结果:

  1. equals:true
  2. equals:false
  3. -----------------------
  4. equals:true
  5. equals:true
  6. -----------------------
  7. contains:true
  8. contains:false
  9. -----------------------
  10. startsWith:true
  11. startsWith:true
  12. startsWith:false
  13. -----------------------
  14. isEmpty:false
  15. isEmpty:true
  16. Exception in thread "main" java.lang.NullPointerException
  17. at Test.main(Test.java:43)

3.3 获取功能

方法 说明
length() 获取字符串长度
charAt(int index) 获取指定位置的字符
indexOf(int ch) 字符第一次出现的索引
indexOf(String str) 字符串第一次出现的索引
indexOf(int ch,int fromIndex) 字符从指定位置后第一次出现的索引
indexOf(String str,int from) 字符串从指定位置后第一次出现的索引
lastIndexOf() 字符串最后一次出现的索引
subString(int start) 从指定位置开始截取字符串
subString(int start,int end) 截取字符串,包左不包右
  1. package cn.itcast_04;
  2. /*
  3. * String类的获取功能
  4. * int length():获取字符串的长度。
  5. * char charAt(int index):获取指定索引位置的字符
  6. * int indexOf(int ch):返回指定字符在此字符串中第一次出现处的索引。
  7. * 为什么这里是int类型,而不是char类型?
  8. * 原因是:'a'和97其实都可以代表'a'
  9. * int indexOf(String str):返回指定字符串在此字符串中第一次出现处的索引。
  10. * int indexOf(int ch,int fromIndex):返回指定字符在此字符串中从指定位置后第一次出现处的索引。
  11. * int indexOf(String str,int fromIndex):返回指定字符串在此字符串中从指定位置后第一次出现处的索引。
  12. * String substring(int start):从指定位置开始截取字符串,默认到末尾。
  13. * String substring(int start,int end):从指定位置开始到指定位置结束截取字符串。
  14. */
  15. public class StringDemo {
  16. public static void main(String[] args) {
  17. // 定义一个字符串对象
  18. String s = "helloworld";
  19. // int length():获取字符串的长度。
  20. System.out.println("s.length:" + s.length());
  21. System.out.println("----------------------");
  22. // char charAt(int index):获取指定索引位置的字符
  23. System.out.println("charAt:" + s.charAt(7));
  24. System.out.println("----------------------");
  25. // int indexOf(int ch):返回指定字符在此字符串中第一次出现处的索引。
  26. System.out.println("indexOf:" + s.indexOf('l'));
  27. System.out.println("----------------------");
  28. // int indexOf(String str):返回指定字符串在此字符串中第一次出现处的索引。
  29. System.out.println("indexOf:" + s.indexOf("owo"));
  30. System.out.println("----------------------");
  31. // int indexOf(int ch,int fromIndex):返回指定字符在此字符串中从指定位置后第一次出现处的索引。
  32. System.out.println("indexOf:" + s.indexOf('l', 4));
  33. System.out.println("indexOf:" + s.indexOf('k', 4)); // -1
  34. System.out.println("indexOf:" + s.indexOf('l', 40)); // -1
  35. System.out.println("----------------------");
  36. // 自己练习:int indexOf(String str,int
  37. // fromIndex):返回指定字符串在此字符串中从指定位置后第一次出现处的索引。
  38. // String substring(int start):从指定位置开始截取字符串,默认到末尾。包含start这个索引
  39. System.out.println("substring:" + s.substring(5));
  40. System.out.println("substring:" + s.substring(0));
  41. System.out.println("----------------------");
  42. // String substring(int start,int
  43. // end):从指定位置开始到指定位置结束截取字符串。包括start索引但是不包end索引
  44. System.out.println("substring:" + s.substring(3, 8));
  45. System.out.println("substring:" + s.substring(0, s.length()));
  46. }
  47. }

运行结果:

  1. s.length:10
  2. ----------------------
  3. charAt:r
  4. ----------------------
  5. indexOf:2
  6. ----------------------
  7. indexOf:4
  8. ----------------------
  9. indexOf:8
  10. indexOf:-1
  11. indexOf:-1
  12. ----------------------
  13. substring:world
  14. substring:helloworld
  15. ----------------------
  16. substring:lowor
  17. substring:helloworld

3.4 转换功能

方法 说明
getBytes() 把字符串转成字节数组
getCharArray() 把字符串转成字符数组
valueOf(char[] chs) 把字符数组转成字符串
valueOf(int i) 把int类型的数据转成字符串
toLowerCase() 把字符串转成小写
toUpperCase() 把字符串转成大写
concat(String str) 字符串拼接
  1. package cn.itcast_05;
  2. /*
  3. * String的转换功能:
  4. * byte[] getBytes():把字符串转换为字节数组。
  5. * char[] toCharArray():把字符串转换为字符数组。
  6. * static String valueOf(char[] chs):把字符数组转成字符串。
  7. * static String valueOf(int i):把int类型的数据转成字符串。
  8. * 注意:String类的valueOf方法可以把任意类型的数据转成字符串。
  9. * String toLowerCase():把字符串转成小写。
  10. * String toUpperCase():把字符串转成大写。
  11. * String concat(String str):把字符串拼接。
  12. */
  13. public class StringDemo {
  14. public static void main(String[] args) {
  15. // 定义一个字符串对象
  16. String s = "JavaSE";
  17. // byte[] getBytes():把字符串转换为字节数组。
  18. byte[] bys = s.getBytes();
  19. for (int x = 0; x < bys.length; x++) {
  20. System.out.println(bys[x]);
  21. }
  22. System.out.println("----------------");
  23. // char[] toCharArray():把字符串转换为字符数组。
  24. char[] chs = s.toCharArray();
  25. for (int x = 0; x < chs.length; x++) {
  26. System.out.println(chs[x]);
  27. }
  28. System.out.println("----------------");
  29. // static String valueOf(char[] chs):把字符数组转成字符串。
  30. String ss = String.valueOf(chs);
  31. System.out.println(ss);
  32. System.out.println("----------------");
  33. // static String valueOf(int i):把int类型的数据转成字符串。
  34. int i = 100;
  35. String sss = String.valueOf(i);
  36. System.out.println(sss);
  37. System.out.println("----------------");
  38. // String toLowerCase():把字符串转成小写。
  39. System.out.println("toLowerCase:" + s.toLowerCase());
  40. System.out.println("s:" + s);
  41. // System.out.println("----------------");
  42. // String toUpperCase():把字符串转成大写。
  43. System.out.println("toUpperCase:" + s.toUpperCase());
  44. System.out.println("----------------");
  45. // String concat(String str):把字符串拼接。
  46. String s1 = "hello";
  47. String s2 = "world";
  48. String s3 = s1 + s2;
  49. String s4 = s1.concat(s2);
  50. System.out.println("s3:"+s3);
  51. System.out.println("s4:"+s4);
  52. }
  53. }

运行结果:

  1. 74
  2. 97
  3. 118
  4. 97
  5. 83
  6. 69
  7. ----------------
  8. J
  9. a
  10. v
  11. a
  12. S
  13. E
  14. ----------------
  15. JavaSE
  16. ----------------
  17. 100
  18. ----------------
  19. toLowerCase:javase
  20. s:JavaSE
  21. toUpperCase:JAVASE
  22. ----------------
  23. s3:helloworld
  24. s4:helloworld

3.5 其他功能

方法 说明
replace(char old,char new) 替换字符
replace(String old,String new) 替换字符串
trim() 去掉字符串两端空格
compareTo() 按字典顺序比较字符串
compareToIngnoreCase() 按字典顺序比较字符串,忽略大小写
format() 格式化字符串
  1. String.format(Locale.CHINA"第%03d条数据%s"10"str")

更多关于字符串格式化的内容,请看 Java字符串格式化String.format()的使用

  1. package cn.itcast_06;
  2. /*
  3. * String类的其他功能:
  4. *
  5. * 替换功能:
  6. * String replace(char old,char new)
  7. * String replace(String old,String new)
  8. *
  9. * 去除字符串两空格
  10. * String trim()
  11. *
  12. * 按字典顺序比较两个字符串
  13. * int compareTo(String str)
  14. * int compareToIgnoreCase(String str)
  15. */
  16. public class StringDemo {
  17. public static void main(String[] args) {
  18. // 替换功能
  19. String s1 = "helloworld";
  20. String s2 = s1.replace('l', 'k');
  21. String s3 = s1.replace("owo", "ak47");
  22. System.out.println("s1:" + s1);
  23. System.out.println("s2:" + s2);
  24. System.out.println("s3:" + s3);
  25. System.out.println("---------------");
  26. // 去除字符串两空格
  27. String s4 = " hello world ";
  28. String s5 = s4.trim();
  29. System.out.println("s4:" + s4 + "---");
  30. System.out.println("s5:" + s5 + "---");
  31. // 按字典顺序比较两个字符串
  32. String s6 = "hello";
  33. String s7 = "hello";
  34. String s8 = "abc";
  35. String s9 = "xyz";
  36. System.out.println(s6.compareTo(s7));// 0
  37. System.out.println(s6.compareTo(s8));// 7
  38. System.out.println(s6.compareTo(s9));// -16
  39. }
  40. }

运行结果:

  1. s1:helloworld
  2. s2:hekkoworkd
  3. s3:hellak47rld
  4. ---------------
  5. s4: hello world ---
  6. s5:hello world---
  7. 0
  8. 7
  9. -16

4. String类练习

4.1 把数组中的数据按照指定个格式拼接成一个字符串

  1. package cn.itcast_07;
  2. /*
  3. * 需求:把数组中的数据按照指定个格式拼接成一个字符串
  4. * 举例:
  5. * int[] arr = {1,2,3};
  6. * 输出结果:
  7. * "[1, 2, 3]"
  8. * 分析:
  9. * A:定义一个字符串对象,只不过内容为空
  10. * B:先把字符串拼接一个"["
  11. * C:遍历int数组,得到每一个元素
  12. * D:先判断该元素是否为最后一个
  13. * 是:就直接拼接元素和"]"
  14. * 不是:就拼接元素和逗号以及空格
  15. * E:输出拼接后的字符串
  16. *
  17. * 把代码用功能实现。
  18. */
  19. public class StringTest2 {
  20. public static void main(String[] args) {
  21. // 前提是数组已经存在
  22. int[] arr = { 1, 2, 3 };
  23. // 写一个功能,实现结果
  24. String result = arrayToString(arr);
  25. System.out.println("最终结果是:" + result);
  26. }
  27. /*
  28. * 两个明确: 返回值类型:String 参数列表:int[] arr
  29. */
  30. public static String arrayToString(int[] arr) {
  31. // 定义一个字符串
  32. String s = "";
  33. // 先把字符串拼接一个"["
  34. s += "[";
  35. // 遍历int数组,得到每一个元素
  36. for (int x = 0; x < arr.length; x++) {
  37. // 先判断该元素是否为最后一个
  38. if (x == arr.length - 1) {
  39. // 就直接拼接元素和"]"
  40. s += arr[x];
  41. s += "]";
  42. } else {
  43. // 就拼接元素和逗号以及空格
  44. s += arr[x];
  45. s += ", ";
  46. }
  47. }
  48. return s;
  49. }
  50. }

4.2 字符串反转

  1. package cn.itcast_07;
  2. import java.util.Scanner;
  3. /*
  4. * 字符串反转
  5. * 举例:键盘录入”abc”
  6. * 输出结果:”cba”
  7. *
  8. * 分析:
  9. * A:键盘录入一个字符串
  10. * B:定义一个新字符串
  11. * C:倒着遍历字符串,得到每一个字符
  12. * a:length()和charAt()结合
  13. * b:把字符串转成字符数组
  14. * D:用新字符串把每一个字符拼接起来
  15. * E:输出新串
  16. */
  17. public class StringTest3 {
  18. public static void main(String[] args) {
  19. // 键盘录入一个字符串
  20. Scanner sc = new Scanner(System.in);
  21. System.out.println("请输入一个字符串:");
  22. String line = sc.nextLine();
  23. /*
  24. // 定义一个新字符串
  25. String result = "";
  26. // 把字符串转成字符数组
  27. char[] chs = line.toCharArray();
  28. // 倒着遍历字符串,得到每一个字符
  29. for (int x = chs.length - 1; x >= 0; x--) {
  30. // 用新字符串把每一个字符拼接起来
  31. result += chs[x];
  32. }
  33. // 输出新串
  34. System.out.println("反转后的结果是:" + result);
  35. */
  36. // 改进为功能实现
  37. String s = myReverse(line);
  38. System.out.println("实现功能后的结果是:" + s);
  39. }
  40. /*
  41. * 两个明确: 返回值类型:String 参数列表:String
  42. */
  43. public static String myReverse(String s) {
  44. // 定义一个新字符串
  45. String result = "";
  46. // 把字符串转成字符数组
  47. char[] chs = s.toCharArray();
  48. // 倒着遍历字符串,得到每一个字符
  49. for (int x = chs.length - 1; x >= 0; x--) {
  50. // 用新字符串把每一个字符拼接起来
  51. result += chs[x];
  52. }
  53. return result;
  54. }
  55. }

4.3 统计大串中小串出现的次数

  1. package cn.itcast_07;
  2. /*
  3. * 统计大串中小串出现的次数
  4. * 举例:
  5. * 在字符串"woaijavawozhenaijavawozhendeaijavawozhendehenaijavaxinbuxinwoaijavagun"
  6. * 结果:
  7. * java出现了5次
  8. *
  9. * 分析:
  10. * 前提:是已经知道了大串和小串。
  11. *
  12. * A:定义一个统计变量,初始化值是0
  13. * B:先在大串中查找一次小串第一次出现的位置
  14. * a:索引是-1,说明不存在了,就返回统计变量
  15. * b:索引不是-1,说明存在,统计变量++
  16. * C:把刚才的索引+小串的长度作为开始位置截取上一次的大串,返回一个新的字符串,并把该字符串的值重新赋值给大串
  17. * D:回到B
  18. */
  19. public class StringTest5 {
  20. public static void main(String[] args) {
  21. // 定义大串
  22. String maxString = "woaijavawozhenaijavawozhendeaijavawozhendehenaijavaxinbuxinwoaijavagun";
  23. // 定义小串
  24. String minString = "java";
  25. // 写功能实现
  26. int count = getCount(maxString, minString);
  27. System.out.println("Java在大串中出现了:" + count + "次");
  28. }
  29. /*
  30. * 两个明确: 返回值类型:int 参数列表:两个字符串
  31. */
  32. public static int getCount(String maxString, String minString) {
  33. // 定义一个统计变量,初始化值是0
  34. int count = 0;
  35. /*
  36. // 先在大串中查找一次小串第一次出现的位置
  37. int index = maxString.indexOf(minString);
  38. // 索引不是-1,说明存在,统计变量++
  39. while (index != -1) {
  40. count++;
  41. // 把刚才的索引+小串的长度作为开始位置截取上一次的大串,返回一个新的字符串,并把该字符串的值重新赋值给大串
  42. // int startIndex = index + minString.length();
  43. // maxString = maxString.substring(startIndex);
  44. maxString = maxString.substring(index + minString.length());
  45. // 继续查
  46. index = maxString.indexOf(minString);
  47. }
  48. */
  49. int index;
  50. //先查,赋值,判断
  51. while((index=maxString.indexOf(minString))!=-1){
  52. count++;
  53. maxString = maxString.substring(index + minString.length());
  54. }
  55. return count;
  56. }
  57. }

5. StringBuffer

由于字符串是常量,因此一旦创建,其内容和长度是不可改变的。如果需要对一个字符串进行修改,则只能创建新的字符串。为了便于对字符串进行修改,在JDK中提供了一个StringBuffer类(也称字符串缓冲区)。StringBuffer类和String类最大的区别在于它的内容和长度都是可以改变的。StringBuffer类似一个字符容器,当在其中添加或删除字符时,并不会产生新的StringBuffer对象。

我们如果对字符串进行拼接操作,每次拼接,都会构建一个新的String对象,既耗时,又浪费空间。而StringBuffer就可以解决这个问题

  • StringBuffer是线程安全的可变字符序列。
  • StringBuffer和String的区别?

前者长度和内容可变,后者不可变。如果使用前者做字符串的拼接,不会浪费太多的资源。

String类表示的字符串是常量,一旦创建后,内容和长度都是无法改变的。而StringBuffer表示字符容器,其内容和长度可以随时修改。在操作字符串时,如果该字符串仅用于表示数据类型,则使用String类即可,但是如果需要对字符串中的字符进行增删操作,则使用StringBuffer类。

String类覆盖了Object类的equals()方法,而StringBuffer类没有覆盖Object类的equals()方法,具体示例如下:

1500705834086

String类对象可以用操作符“+”进行连接,而StringBuffer类对象之间不能,具体示例如下:

1500705855076

6. 常见操作方法

String字符串

6.1 构造方法和获取方法

  1. package cn.itcast_01;
  2. /*
  3. * StringBuffer:
  4. * 线程安全的可变字符串。
  5. *
  6. * StringBuffer和String的区别?
  7. * 前者长度和内容可变,后者不可变。
  8. * 如果使用前者做字符串的拼接,不会浪费太多的资源。
  9. *
  10. * StringBuffer的构造方法:
  11. * public StringBuffer():无参构造方法
  12. * public StringBuffer(int capacity):指定容量的字符串缓冲区对象
  13. * public StringBuffer(String str):指定字符串内容的字符串缓冲区对象
  14. *
  15. * StringBuffer的获取方法:
  16. * public int capacity():返回当前容量。 理论值
  17. * public int length():返回长度(字符数)。 实际值
  18. */
  19. public class StringBufferDemo {
  20. public static void main(String[] args) {
  21. // public StringBuffer():无参构造方法
  22. StringBuffer sb = new StringBuffer();
  23. System.out.println("sb:" + sb);
  24. System.out.println("sb.capacity():" + sb.capacity());
  25. System.out.println("sb.length():" + sb.length());
  26. System.out.println("--------------------------");
  27. // public StringBuffer(int capacity):指定容量的字符串缓冲区对象
  28. StringBuffer sb2 = new StringBuffer(50);
  29. System.out.println("sb2:" + sb2);
  30. System.out.println("sb2.capacity():" + sb2.capacity());
  31. System.out.println("sb2.length():" + sb2.length());
  32. System.out.println("--------------------------");
  33. // public StringBuffer(String str):指定字符串内容的字符串缓冲区对象
  34. StringBuffer sb3 = new StringBuffer("hello");
  35. System.out.println("sb3:" + sb3);
  36. System.out.println("sb3.capacity():" + sb3.capacity());
  37. System.out.println("sb3.length():" + sb3.length());
  38. }
  39. }

6.2 添加功能

  1. package cn.itcast_02;
  2. /*
  3. * StringBuffer的添加功能:
  4. * public StringBuffer append(String str):可以把任意类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身
  5. *
  6. * public StringBuffer insert(int offset,String str):在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身
  7. */
  8. public class StringBufferDemo {
  9. public static void main(String[] args) {
  10. // 创建字符串缓冲区对象
  11. StringBuffer sb = new StringBuffer();
  12. // public StringBuffer append(String str)
  13. // StringBuffer sb2 = sb.append("hello");
  14. // System.out.println("sb:" + sb);
  15. // System.out.println("sb2:" + sb2);
  16. // System.out.println(sb == sb2); // true
  17. // 一步一步的添加数据
  18. // sb.append("hello");
  19. // sb.append(true);
  20. // sb.append(12);
  21. // sb.append(34.56);
  22. // 链式编程
  23. sb.append("hello").append(true).append(12).append(34.56);
  24. System.out.println("sb:" + sb);
  25. // public StringBuffer insert(int offset,String
  26. // str):在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身
  27. sb.insert(5, "world");
  28. System.out.println("sb:" + sb);
  29. }
  30. }

运行结果:

  1. sb:hellotrue1234.56
  2. sb:helloworldtrue1234.56

6.3 删除功能

  1. package cn.itcast_03;
  2. /*
  3. * StringBuffer的删除功能
  4. * public StringBuffer deleteCharAt(int index):删除指定位置的字符,并返回本身
  5. * public StringBuffer delete(int start,int end):删除从指定位置开始指定位置结束的内容,并返回本身
  6. */
  7. public class StringBufferDemo {
  8. public static void main(String[] args) {
  9. // 创建对象
  10. StringBuffer sb = new StringBuffer();
  11. // 添加功能
  12. sb.append("hello").append("world").append("java");
  13. System.out.println("sb:" + sb);
  14. // public StringBuffer deleteCharAt(int index):删除指定位置的字符,并返回本身
  15. // 需求:我要删除e这个字符,肿么办?
  16. // sb.deleteCharAt(1);
  17. // 需求:我要删除第一个l这个字符,肿么办?
  18. // sb.deleteCharAt(1);
  19. // public StringBuffer delete(int start,int
  20. // end):删除从指定位置开始指定位置结束的内容,并返回本身
  21. // 需求:我要删除world这个字符串,肿么办?
  22. // sb.delete(5, 10);
  23. // 需求:我要删除所有的数据
  24. sb.delete(0, sb.length());
  25. System.out.println("sb:" + sb);
  26. }
  27. }

运行结果:

  1. sb:helloworldjava
  2. sb:

6.4 替换功能

  1. package cn.itcast_04;
  2. /*
  3. * StringBuffer的替换功能:
  4. * public StringBuffer replace(int start,int end,String str):从start开始到end用str替换
  5. */
  6. public class StringBufferDemo {
  7. public static void main(String[] args) {
  8. // 创建字符串缓冲区对象
  9. StringBuffer sb = new StringBuffer();
  10. // 添加数据
  11. sb.append("hello");
  12. sb.append("world");
  13. sb.append("java");
  14. System.out.println("sb:" + sb);
  15. // public StringBuffer replace(int start,int end,String
  16. // str):从start开始到end用str替换
  17. // 需求:我要把world这个数据替换为"节日快乐"
  18. sb.replace(5, 10, "节日快乐");
  19. System.out.println("sb:" + sb);
  20. }
  21. }

运行结果:

  1. sb:helloworldjava
  2. sb:hello节日快乐java

6.5 反转功能

  1. package cn.itcast_05;
  2. /*
  3. * StringBuffer的反转功能:
  4. * public StringBuffer reverse()
  5. */
  6. public class StringBufferDemo {
  7. public static void main(String[] args) {
  8. // 创建字符串缓冲区对象
  9. StringBuffer sb = new StringBuffer();
  10. // 添加数据
  11. sb.append("霞青林爱我");
  12. System.out.println("sb:" + sb);
  13. // public StringBuffer reverse()
  14. sb.reverse();
  15. System.out.println("sb:" + sb);
  16. }
  17. }

运行结果:

  1. sb:霞青林爱我
  2. sb:我爱林青霞

6.6 截取功能

  1. package cn.itcast_06;
  2. /*
  3. * StringBuffer的截取功能:注意返回值类型不再是StringBuffer本身了
  4. * public String substring(int start)
  5. * public String substring(int start,int end)
  6. */
  7. public class StringBufferDemo {
  8. public static void main(String[] args) {
  9. // 创建字符串缓冲区对象
  10. StringBuffer sb = new StringBuffer();
  11. // 添加元素
  12. sb.append("hello").append("world").append("java");
  13. System.out.println("sb:" + sb);
  14. // 截取功能
  15. // public String substring(int start)
  16. String s = sb.substring(5);
  17. System.out.println("s:" + s);
  18. System.out.println("sb:" + sb);
  19. // public String substring(int start,int end)
  20. String ss = sb.substring(5, 10);
  21. System.out.println("ss:" + ss);
  22. System.out.println("sb:" + sb);
  23. }
  24. }

运行结果:

  1. sb:helloworldjava
  2. s:worldjava
  3. sb:helloworldjava
  4. ss:world
  5. sb:helloworldjava

7. StringBuffer类练习

7.1 String和StringBuffer的相互转换

  1. package cn.itcast_07;
  2. /*
  3. * 为什么我们要讲解类之间的转换:
  4. * A -- B的转换
  5. * 我们把A转换为B,其实是为了使用B的功能。
  6. * B -- A的转换
  7. * 我们可能要的结果是A类型,所以还得转回来。
  8. *
  9. * String和StringBuffer的相互转换?
  10. */
  11. public class StringBufferTest {
  12. public static void main(String[] args) {
  13. // String -- StringBuffer
  14. String s = "hello";
  15. // 注意:不能把字符串的值直接赋值给StringBuffer
  16. // StringBuffer sb = "hello";
  17. // StringBuffer sb = s;
  18. // 方式1:通过构造方法
  19. StringBuffer sb = new StringBuffer(s);
  20. // 方式2:通过append()方法
  21. StringBuffer sb2 = new StringBuffer();
  22. sb2.append(s);
  23. System.out.println("sb:" + sb);
  24. System.out.println("sb2:" + sb2);
  25. System.out.println("---------------");
  26. // StringBuffer -- String
  27. StringBuffer buffer = new StringBuffer("java");
  28. // String(StringBuffer buffer)
  29. // 方式1:通过构造方法
  30. String str = new String(buffer);
  31. // 方式2:通过toString()方法
  32. String str2 = buffer.toString();
  33. System.out.println("str:" + str);
  34. System.out.println("str2:" + str2);
  35. }
  36. }

运行结果:

  1. sb:hello
  2. sb2:hello
  3. ---------------
  4. str:java
  5. str2:java

7.2 把数组拼接成一个字符串

  1. package cn.itcast_07;
  2. /*
  3. * 把数组拼接成一个字符串
  4. */
  5. public class StringBufferTest2 {
  6. public static void main(String[] args) {
  7. // 定义一个数组
  8. int[] arr = { 44, 33, 55, 11, 22 };
  9. // 定义功能
  10. // 方式1:用String做拼接的方式
  11. String s1 = arrayToString(arr);
  12. System.out.println("s1:" + s1);
  13. // 方式2:用StringBuffer做拼接的方式
  14. String s2 = arrayToString2(arr);
  15. System.out.println("s2:" + s2);
  16. }
  17. // 用StringBuffer做拼接的方式
  18. public static String arrayToString2(int[] arr) {
  19. StringBuffer sb = new StringBuffer();
  20. sb.append("[");
  21. for (int x = 0; x < arr.length; x++) {
  22. if (x == arr.length - 1) {
  23. sb.append(arr[x]);
  24. } else {
  25. sb.append(arr[x]).append(", ");
  26. }
  27. }
  28. sb.append("]");
  29. return sb.toString();
  30. }
  31. // 用String做拼接的方式
  32. public static String arrayToString(int[] arr) {
  33. String s = "";
  34. s += "[";
  35. for (int x = 0; x < arr.length; x++) {
  36. if (x == arr.length - 1) {
  37. s += arr[x];
  38. } else {
  39. s += arr[x];
  40. s += ", ";
  41. }
  42. }
  43. s += "]";
  44. return s;
  45. }
  46. }

运行结果:

  1. s1:[44, 33, 55, 11, 22]
  2. s2:[44, 33, 55, 11, 22]

7.3 把字符串反转

  1. package cn.itcast_07;
  2. import java.util.Scanner;
  3. /*
  4. * 把字符串反转
  5. */
  6. public class StringBufferTest3 {
  7. public static void main(String[] args) {
  8. // 键盘录入数据
  9. Scanner sc = new Scanner(System.in);
  10. System.out.println("请输入数据:");
  11. String s = sc.nextLine();
  12. // 方式1:用String做拼接
  13. String s1 = myReverse(s);
  14. System.out.println("s1:" + s1);
  15. // 方式2:用StringBuffer的reverse()功能
  16. String s2 = myReverse2(s);
  17. System.out.println("s2:" + s2);
  18. }
  19. // 用StringBuffer的reverse()功能
  20. public static String myReverse2(String s) {
  21. // StringBuffer sb = new StringBuffer();
  22. // sb.append(s);
  23. // StringBuffer sb = new StringBuffer(s);
  24. // sb.reverse();
  25. // return sb.toString();
  26. // 简易版
  27. return new StringBuffer(s).reverse().toString();
  28. }
  29. // 用String做拼接
  30. public static String myReverse(String s) {
  31. String result = "";
  32. char[] chs = s.toCharArray();
  33. for (int x = chs.length - 1; x >= 0; x--) {
  34. // char ch = chs[x];
  35. // result += ch;
  36. result += chs[x];
  37. }
  38. return result;
  39. }
  40. }

运行结果:

  1. 请输入数据:
  2. hello world
  3. s1:dlrow olleh
  4. s2:dlrow olleh

7.4 判断一个字符串是否是对称字符串

  1. package cn.itcast_07;
  2. import java.util.Scanner;
  3. /*
  4. * 判断一个字符串是否是对称字符串
  5. * 例如"abc"不是对称字符串,"aba"、"abba"、"aaa"、"mnanm"是对称字符串
  6. *
  7. * 分析:
  8. * 判断一个字符串是否是对称的字符串,我只需要把
  9. * 第一个和最后一个比较
  10. * 第二个和倒数第二个比较
  11. * ...
  12. * 比较的次数是长度除以2。
  13. */
  14. public class StringBufferTest4 {
  15. public static void main(String[] args) {
  16. // 创建键盘录入对象
  17. Scanner sc = new Scanner(System.in);
  18. System.out.println("请输入一个字符串:");
  19. String s = sc.nextLine();
  20. // 一个一个的比较
  21. boolean b = isSame(s);
  22. System.out.println("b:" + b);
  23. //用字符串缓冲区的反转功能
  24. boolean b2 = isSame2(s);
  25. System.out.println("b2:"+b2);
  26. }
  27. public static boolean isSame2(String s) {
  28. return new StringBuffer(s).reverse().toString().equals(s);
  29. }
  30. // public static boolean isSame(String s) {
  31. // // 把字符串转成字符数组
  32. // char[] chs = s.toCharArray();
  33. //
  34. // for (int start = 0, end = chs.length - 1; start <= end; start++, end--) {
  35. // if (chs[start] != chs[end]) {
  36. // return false;
  37. // }
  38. // }
  39. //
  40. // return true;
  41. // }
  42. public static boolean isSame(String s) {
  43. boolean flag = true;
  44. // 把字符串转成字符数组
  45. char[] chs = s.toCharArray();
  46. for (int start = 0, end = chs.length - 1; start <= end; start++, end--) {
  47. if (chs[start] != chs[end]) {
  48. flag = false;
  49. break;
  50. }
  51. }
  52. return flag;
  53. }
  54. }

运行结果:

  1. 请输入一个字符串:
  2. abcba
  3. b:true
  4. b2:true

8. String常见问题

8.1 Strings = new String(“xyz”);创建了几个String Object?二者之间有什么区别?

两个或一个,”xyz”对应一个对象,这个对象放在字符串常量缓冲区,常量”xyz”不管出现多少遍,都是缓冲区中的那一个。new String()每写一遍,就创建一个新的对象,它一句那个常量”xyz”对象的内容来创建出一个新String对象。如果以前就用过”xyz”,这句代表就不会创建”xyz”自己了,直接从缓冲区拿。

8.2 String和StringBuffer的区别?

String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。String类表示内容不可改变的字符串,而StringBuffer类表示内容可以被修改的字符串。String重写了equals()方法和hashCode()方法,而StringBuffer没有重写equals方法和hashCode方法,所以,将StringBuffer对象存储进Java集合类中时会出现问题。StringBuffer更加高效。

8.3 StringBuffer与StringBuilder的区别?

StringBuffer和StringBuilder类都表示内容可以被修改的字符串,StringBuilder是线程不安全的,运行效率高,如果一个字符串变量是在方法里面定义,这种情况只可能有一个线程访问它,不存在不安全的因素了,则用StringBuilder。如果要在类里面定义成员变量,并且这个类的实例对象会在多线程环境下使用,那么最好用StringBuffer。

8.4 如何把一段逗号分割的字符串转换成一个数组?

用正则表达式:String [ ] result = Str.split(“, ”) ;

8.5 Strings="a"+"b"+"c"+"d"; 一共创建了多少个对象?

一个,相当于直接定义了一个”abcd”的字符串。Javac编译可以对字符串常量直接相加的表达式进行优化,不必要等到运行期去进行加法运算处理,而是在编译时去掉其中的加号,直接将其编译成一个这些常量相连的结果。

8.6 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉的半个”。

1491233180836

8.7 有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数

思路:取出字符串的每一个字符到HashMap中去找,如果不存在,则把该字符和1分别作为键和值添加到集合中,如果存在,则把该字符和值加1作为键和值添加到集合中。最后遍历集合即可得到字符的个数

1491233242191

8.8 如果一串字符如”aaaabbc中国1512”要分别统计英文字符的数量,中文字符的数量,和数字字符的数量,假设字符中没有中文字符、英文字符、数字字符之外的其他特殊字符。

1491233285336

  1. // 字符串反转
  2. Public static String Reverce(String str){
  3. return new StringBuffer(str).reverce().toString();
  4. }
  5. // 判断字符串是否对称
  6. Public static boolean isSame(String str){
  7. return new StringBuffer(str).reverce().toString().equals(str);
  8. }

8.9 把数组拼接成指定格式的字符串

1491271174524

8.10 把字符串中的字符进行排序

1491271246139